package com.pliu.config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

/**
 * @BelongsProject: springStudy
 * @BelongsPackage: com.pliu.config
 * @Author: pliu
 * @CreateTime: 2019-01-10 22:24
 * @Description: 声明式事务配置类
 * 笔记:注解方式的声明式事务使用步骤:
 *      1,导入相关依赖(数据源、数据库驱动、Spring-jdbc模块)
 *      2,配置数据源、JdbcTemplate（Spring提供的简化数据库操作的工具）操作数据
 *      3,给方法上标注@Transactional 表示当前方法是一个事务方法；
 *      4,@EnableTransactionManagement 开启基于注解的事务管理功能；
 *      5,配置事务管理器来控制事务;
 * 		    @Bean
 * 		    public PlatformTransactionManager/DataSourceTransactionManager transactionManager()
 * 		以上5步;
 */
@EnableAspectJAutoProxy        //开启AOP代理自动配置
@EnableTransactionManagement   //基于注解的事务管理
@ComponentScan({"com.pliu"})
@Configuration
public class TxConfig {

    @Bean
    public DataSource dataSource() throws Exception {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        //数据源请更换成你自己的
        dataSource.setUser("xxxx");
        dataSource.setPassword("xxxxxxxx");
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://47.98.216.253:3306/pliu?useUnicode=true&characterEncoding=UTF-8");
        return dataSource;
    }
    @Bean
    public JdbcTemplate jdbcTemplate() throws Exception {
        //spring对@Configuration配置类有特殊处理,不会重复创建数据源对象
        return new JdbcTemplate(dataSource());
    }

    //注册事务管理器
    @Bean
    public DataSourceTransactionManager platformTransactionManager() throws Exception {
        return new DataSourceTransactionManager(dataSource());
    }


}
